/* edit.c
   A simple input_to based editor.
   Can be called by mailers, bulletin boards, and other objects which
   allow players to write files.
   You fire it up by calling begin_edit, passing it the name of a
   function to call when the edit finishes. The return call must go
   to the same object that started the edit, for security. You can
   also pass a second argument which will be carried along and sent
   back to the return call. The bboard, for example, uses this to
   store the subject of the note.
   Mobydick, 7-10-94.
   Should eventually add a hook for wizards to enter the real editor.
*/

static string *file;
static object return_ob;
static string return_func;
static int    edit_busy;
static mixed  argument;

object query_user();
static void finish_edit();

varargs int begin_edit(string func, mixed arg){
    if(edit_busy)
    	return 0;

    if(!func)
    	return 0;

    argument = arg;
    edit_busy = 1;
    file = ({ });
	/* For security reasons, the return call must go to the calling object. */
    return_ob = previous_object();
    return_func = func;
    write("*\b");
    input_to("enter_line");
    return 1;
}

void enter_line(string str){
    if(previous_object() != query_user())
    	return;

    if(str == "."){
        finish_edit();
		return;
    }
    if(str == "~a"){
        file = ({ });
		finish_edit();
		return;
    }
    file += ({ str });
    write("*\b");
    input_to("enter_line");
}

static void finish_edit(){
    edit_busy = 0;
    if(argument){
        call_other(return_ob, return_func, file, argument);
    }else{
        call_other(return_ob, return_func, file);
    }
}
